#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Mouse: folgt dem Mouse-Curser
# beenden: pkill -9 mouse.py

import sys
import time
import random
import pygame
import numpy as np
import math

ScreenW=30
ScreenH=20
Zoom=20
RasterColor=50
HindernissColor=100
ObjektX=11 # Spieler
ObjektY=4
xPos=0 # Mouse-Cursor
yPos=0
PlanMax=3 # Anzahl Planschritte in Zukunft
EntfernungNeu=0 # Entfernung zu Home
EntfernungAlt=0 # Entfernung zu Home


#-----------------------------------------
def PhysikEngine(Draw, moveMax):
# Draw: 1=mit Bildschirmausgabe
# moveMax: Anzahl Schritte

  global ObjektX, ObjektY, EntfernungNeu, EntfernungAlt

  # Objekt sichern
  xSave=ObjektX
  ySave=ObjektY

  # Plan ausfuehren
  for i in range(0, moveMax):
    # print "Move ",i
    if Bildschirm[ObjektX,ObjektY+1]!=1:  # Gravitation
      ObjektY+=1
    if Plan[i]==1: # links
      if Bildschirm[ObjektX-1,ObjektY]!=1: # keine Wand?
        ObjektX-=1
    if Plan[i]==2: # rechts?
      if Bildschirm[ObjektX+1,ObjektY]!=1: # keine Wand?
        ObjektX+=1
    if Plan[i]==3: # Sprung?
      if Bildschirm[ObjektX,ObjektY+1]==1: # Untergrund vorhanden?
        ObjektY-=5
    if Draw==1:
      Ausgabe()
      # time.sleep(0.2)

  # Abstand zwischen 2 Punkten
  # d=sqrt((x2-x1)hoch2+(y2-y1)hoch2)

  # Entfernung zu Home berechnen
  temp1=math.pow((xPos-ObjektX),2)
  temp2=math.pow((yPos-ObjektY),2)
  EntfernungNeu=math.sqrt(temp1+temp2)

  temp1=math.pow((xPos-xSave),2)
  temp2=math.pow((yPos-ySave),2)
  EntfernungAlt=math.sqrt(temp1+temp2)

  # Objekt zurueckschreiben
  if Draw==0:
    ObjektX=xSave
    ObjektY=ySave

# end def PhysikEngine():
#-----------------------------------------



# ------------------------------------------
def Planen():
  for a in range(0, 10): # verschiedene Plaene
    print "Plan Nr ",a
    
    for i in range(0, PlanMax):
      Plan[i]=random.randint(1,3) # Plan erstellen
      print Plan[i]     # Plan ausgeben

    PhysikEngine(0, PlanMax)
    print "EntfernungAlt ", EntfernungAlt
    print "EntfernungNeu ", EntfernungNeu

    if EntfernungNeu<EntfernungAlt:
      print "guter Plan"
      PhysikEngine(1, PlanMax)
    else:
      print "schlechter Plan, keine Ausfuehrung"
# end def Planen()  


# ------------------------------------------
def Ausgabe():

  window.fill((0, 0, 0)) # Bildschirm loeschen

  # Raster zeichnen
  for x in range(0, ScreenW):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (x*Zoom, 0), (x*Zoom, ScreenW*Zoom))
  for y in range(0, ScreenH):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (0, y*Zoom), (ScreenW*Zoom, y*Zoom))

  # Bildschirm ausgeben
  for x in range(0, ScreenW):
    for y in range(0, ScreenH):
      if Bildschirm[x,y] == 1: # Hinderniss
        pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))

  # Home einzeichnen
  x=xPos; y=yPos;
  pygame.draw.rect(window, (HindernissColor,2*HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom),2)
  # Beschriftung
  myfont = pygame.font.SysFont("freesans", Zoom)
  label = myfont.render("Home", 1, (HindernissColor,2*HindernissColor,HindernissColor))
  window.blit(label, (x*Zoom,y*Zoom-Zoom))

  # Spieler ausgeben
  pygame.draw.circle(window, (HindernissColor,2*HindernissColor,HindernissColor), (ObjektX*Zoom+Zoom/2,ObjektY*Zoom+Zoom/2),10)


  pygame.display.flip()

# end def Ausgabe():



# ------------------------------------------
# M A I N
# ------------------------------------------

# Array 
Bildschirm=np.zeros((ScreenW,ScreenH),dtype=int) # initialisieren mit 0
Plan=np.zeros((PlanMax),dtype=int) # initialisieren mit 0

# Hindernisse festlegen
Bildschirm[10,10]=1
Bildschirm[11,10]=1
Bildschirm[12,10]=1
Bildschirm[13,10]=1
Bildschirm[14,10]=1
Bildschirm[14,9]=1
Bildschirm[14,8]=1
Bildschirm[14,7]=1

Bildschirm[20,18]=1

Bildschirm[3,4]=1
Bildschirm[4,4]=1
Bildschirm[5,4]=1

Bildschirm[3,16]=1
Bildschirm[4,16]=1
Bildschirm[5,16]=1


# Hinderniss am Boden
for x in range(0, ScreenW):
  Bildschirm[x,ScreenH-1]=1
# Hinderniss linke Wand
for x in range(0, ScreenH-1):
  Bildschirm[0,x]=1
# Hinderniss rechte Wand
for x in range(0, ScreenH-1):
  Bildschirm[ScreenW-1,x]=1

# Home festlegen
# Bildschirm[0,0]=2 # wird später durch Mouse-Curser definiert



#create the screen
pygame.init()
window = pygame.display.set_mode((ScreenW*Zoom,ScreenH*Zoom))

Ausgabe()

#input handling
while True: 
  #time.sleep(0.2) # um CPU Auslastung zu senken
  Planen()
  time.sleep(0.2)
  for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
         sys.exit(0) 
     elif event.type == pygame.MOUSEMOTION:
       x, y = event.pos
       print "mouse at (%d, %d)" % (x/Zoom,y/Zoom)
       xPos=x/Zoom; yPos=y/Zoom;
       Ausgabe();
#       Ausgabe(x/Zoom,y/Zoom,0)

     elif event.type==pygame.MOUSEBUTTONDOWN and event.button==1:
#       Ausgabe(x/Zoom,y/Zoom,1)
       print "You pressed the left mouse button at (%d, %d)" % event.pos
     elif event.type==pygame.MOUSEBUTTONUP and event.button==1:
#       Ausgabe(x/Zoom,y/Zoom,2)
       print "You released the left mouse button at (%d, %d)" % event.pos

     else: 
         print event 

# time.sleep(20)
